00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef BASEPARSER_HPP_
00014 #define BASEPARSER_HPP_
00015
00016 #define OLD_MAP
00017
00018 #include <iostream>
00019 #include <string>
00020 #include <vector>
00021 #include <map>
00022 #ifndef OLD_MAP
00023 #include <boost/unordered_map.hpp>
00024 #endif
00025
00026
00027 #include "gridpack/component/base_component.hpp"
00028 #include "gridpack/timer/coarse_timer.hpp"
00029 #include "gridpack/component/data_collection.hpp"
00030 #include "gridpack/parser/dictionary.hpp"
00031 #include "gridpack/utilities/exception.hpp"
00032 #include "gridpack/network/base_network.hpp"
00033
00034 namespace gridpack {
00035 namespace parser {
00036
00037 template <class _network>
00038 class BaseParser
00039 {
00040 public:
00041
00042
00043 explicit BaseParser() : p_configExists(false) {}
00044
00045
00046
00047
00048 virtual ~BaseParser(){}
00049
00050 void createNetwork(std::vector<boost::shared_ptr<component::DataCollection> >
00051 &busData, std::vector<boost::shared_ptr<component::DataCollection> >
00052 &branchData)
00053 {
00054 p_timer = gridpack::utility::CoarseTimer::instance();
00055 int t_create = p_timer->createCategory("Parser:createNetwork");
00056 p_timer->start(t_create);
00057 int me(p_network->communicator().rank());
00058 int nprocs(p_network->communicator().size());
00059 int i;
00060
00061
00062 std::vector<int> sbus(nprocs);
00063 std::vector<int> sbranch(nprocs);
00064 std::vector<int> nbus(nprocs);
00065 std::vector<int> nbranch(nprocs);
00066 for (i=0; i<nprocs; i++) {
00067 sbus[i] = 0;
00068 sbranch[i] = 0;
00069 }
00070 sbus[me] = busData.size();
00071 sbranch[me] = branchData.size();
00072 MPI_Comm comm = static_cast<MPI_Comm>(p_network->communicator());
00073 int ierr;
00074 ierr = MPI_Allreduce(&sbus[0],&nbus[0],nprocs,MPI_INT,MPI_SUM,comm);
00075 ierr = MPI_Allreduce(&sbranch[0],&nbranch[0],nprocs,MPI_INT,MPI_SUM,comm);
00076
00077 std::vector<int> offset_bus(nprocs);
00078 std::vector<int> offset_branch(nprocs);
00079 offset_bus[0] = 0;
00080 offset_branch[0] = 0;
00081 for (i=1; i<nprocs; i++) {
00082 offset_bus[i] = offset_bus[i-1]+nbus[i-1];
00083 offset_branch[i] = offset_branch[i-1]+nbranch[i-1];
00084 }
00085
00086 int numBus = busData.size();
00087 for (i=0; i<numBus; i++) {
00088 int idx;
00089 busData[i]->getValue(BUS_NUMBER,&idx);
00090 p_network->addBus(idx);
00091 p_network->setGlobalBusIndex(i,i+offset_bus[me]);
00092 *(p_network->getBusData(i)) = *(busData[i]);
00093 p_network->getBusData(i)->addValue(CASE_ID,p_case_id);
00094 p_network->getBusData(i)->addValue(CASE_SBASE,p_case_sbase);
00095 }
00096 int numBranch = branchData.size();
00097 for (i=0; i<numBranch; i++) {
00098 int idx1, idx2;
00099 branchData[i]->getValue(BRANCH_FROMBUS,&idx1);
00100 branchData[i]->getValue(BRANCH_TOBUS,&idx2);
00101 p_network->addBranch(idx1, idx2);
00102 p_network->setGlobalBranchIndex(i,i+offset_branch[me]);
00103 #ifdef OLD_MAP
00104 std::map<int, int>::iterator it;
00105 #else
00106 boost::unordered_map<int, int>::iterator it;
00107 #endif
00108 *(p_network->getBranchData(i)) = *(branchData[i]);
00109 p_network->getBranchData(i)->addValue(CASE_ID,p_case_id);
00110 p_network->getBranchData(i)->addValue(CASE_SBASE,p_case_sbase);
00111 }
00112 p_configExists = true;
00113 #if 0
00114
00115 printf("Number of buses: %d\n",numBus);
00116 for (i=0; i<numBus; i++) {
00117 printf("Dumping bus: %d\n",i);
00118 p_network->getBusData(i)->dump();
00119 }
00120 printf("Number of branches: %d\n",numBranch);
00121 for (i=0; i<numBranch; i++) {
00122 printf("Dumping branch: %d\n",i);
00123 p_network->getBranchData(i)->dump();
00124 }
00125 #endif
00126 busData.clear();
00127 branchData.clear();
00128 p_timer->stop(t_create);
00129 }
00130
00131 protected:
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void setNetwork(boost::shared_ptr<_network> network)
00142 {
00143 p_network = network;
00144 p_network_data = network->getNetworkData();
00145 }
00146
00147
00148
00149
00150 void setCaseID(int id)
00151 {
00152 p_case_id = id;
00153 }
00154
00155 void setCaseSBase(double sb)
00156 {
00157 p_case_sbase = sb;
00158 }
00159
00160 bool configExists(void)
00161 {
00162 return p_configExists;
00163 }
00164
00165
00166
00167
00168
00169
00170 boost::shared_ptr<_network> p_network;
00171
00172 int p_case_id;
00173 double p_case_sbase;
00174 gridpack::utility::CoarseTimer *p_timer;
00175 bool p_configExists;
00176
00177
00178
00179 boost::shared_ptr<gridpack::component::DataCollection> p_network_data;
00180 };
00181
00182 }
00183 }
00184
00185 #endif